﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code;
using Web.Framework.Controls;
using PlanProd.Contracts.enums;
using WebAppPlanProduccion.Code.Security;
using Web.Framework;
using System.Collections.Specialized;

namespace WebAppPlanProduccion.App
{
    public partial class PresupuestoProduccionEdit : BasePage
    {
        private PresupuestoProduccion PresupuestoProduccion { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            HasPermissionToSeeMe(PlanProdSecurity.PRESUPUESTOPRODUCCION_VER);
            
            if (this.Request.QueryString["Id"] != null)
            {
                int id = Convert.ToInt32(this.Request.QueryString["Id"]);
                PresupuestoProduccion = WebServiceHelper.GetPresupuestoProduccionById(id);
              
                // si no vino el event target
                if (this.Request.Form[Page.postEventSourceID] == null)
                {
                    Bind();
                }                
            }
        }

        protected override void ApplySecurity()
        {
            if (PresupuestoProduccion.Estado == EstadoAprobado.Aprobado)
            {
                this.lnkActualizarProducto.Visible = false;
                this.lnkAgregarProducto2.Visible = false;
                this.lnkAprobar.Visible = false;
                this.lnkGuardar.Visible = false;
                this.lnkGuardar.Visible = false;
                this.lnkVerPlanActual.Visible = true;
                this.lnkGuardarCabecera.Visible = false;
                this.PlanProduccionCtrl1.InputsReadOnly = true;
                
                if (this.PlanProduccionCtrl1.ProductosDataSource != null)
                {
                    PlanProduccionCtrl1.ShowDeleteButton = false;
                }
            }
            else
            {
                this.lnkVerPlanActual.Visible = false;
                this.lnkGuardarCabecera.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_EDITAR);
                this.lnkActualizarProducto.Visible = this.lnkAgregarProducto2.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_DETALLE_IMPORTAR);
                this.lnkAprobar.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_APROBAR);
                this.lnkGuardar.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_EDITAR);
                this.PlanProduccionCtrl1.InputsReadOnly = !HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_EDITAR);

                if (this.PlanProduccionCtrl1.ProductosDataSource != null)
                {
                    PlanProduccionCtrl1.ShowDeleteButton = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_DETALLE_ELIMINAR);
                    //PlanProduccionCtrl1.sho
                }
            }
        }

        private void Bind()
        {
            if (PresupuestoProduccion.Estado == EstadoAprobado.Aprobado)
            {
                this.lnkVerPlanActual.NavigateUrl = string.Format("/App/PlanProduccionEdit.aspx?Id={0}", PresupuestoProduccion.PlanProduccionId);
                this.lnkVerPlanActual.Visible = true;
                this.lnkAprobar.Visible = false;
                this.lnkCancelar.Text = "Volver";
                this.txtNombre.ReadOnly = true;
                this.txtNombre.CssClass = "inputs readonly";
                this.lnkGuardarCabecera.Visible = false;
            }
            else
            {
                this.lnkVerPlanActual.NavigateUrl = string.Empty;
                this.lnkVerPlanActual.Visible = false;
            }

            BindAuditory(PresupuestoProduccion);

            this.txtNombre.Text = PresupuestoProduccion.Nombre;
            this.txtPresupuestoId.Text = PresupuestoProduccion.Id.ToString();
            hidTemporadaId.Value = PresupuestoProduccion.TemporadaId.ToString();
            this.txtTemporada.Text = PresupuestoProduccion.TemporadaNombre;
            this.txtDestino.Text = PresupuestoProduccion.DestinoNombre;
            this.txtProveedor.Text = PresupuestoProduccion.ProveedorNombre;
            this.txtEstado.Text = PresupuestoProduccion.EstadoNombre;
            if (PresupuestoProduccion.FechaAprobacion.HasValue)
            {
                this.txtFechaConfirmacion.Text = PresupuestoProduccion.FechaAprobacion.Value.ToString("dd/MM/yyyy");
                this.txtUsuarioConfi.Text = PresupuestoProduccion.UserNameAprobacion;
            }
            this.txtTotalPresupuesto.Text = PresupuestoProduccion.TotalPresupuesto.ToString();

            List<CantidadesProducto> productos = new List<CantidadesProducto>();

            Temporada temporada = WebServiceHelper.GetTemporadaById(PresupuestoProduccion.TemporadaId);

            HybridDictionary hdictionary = temporada.GetHybridNumeroSemanaAnio();            

            foreach (var detalleProducto in PresupuestoProduccion.DetalleDeProductos)
            {
                CantidadesProducto producto = new CantidadesProducto();
                producto.Id = detalleProducto.Id;
                producto.ProductoId = detalleProducto.ProductoId;
                producto.ProductoIdExterno = detalleProducto.ProductoIdExterno;
                producto.ProductoNombre = detalleProducto.ProductoNombre;
                producto.ColorId = detalleProducto.ColorId;
                producto.Color = detalleProducto.ColorNombre;
                producto.CalidadId = detalleProducto.CalidadId;
                producto.Calidad = detalleProducto.CalidadNombre;

                producto.Semanas = new List<SemanaCantidadProducto>();
                foreach (var cantidadSemana in detalleProducto.CantidadesPorSemana)
                {
                    SemanaCantidadProducto semana = new SemanaCantidadProducto();
                    semana.NumeroSemana = cantidadSemana.NumeroSemana;
                    semana.Anio = Convert.ToInt32(hdictionary[cantidadSemana.NumeroSemana]);
                    semana.Cantidad = cantidadSemana.Cantidad;
                    producto.Semanas.Add(semana);
                }

                productos.Add(producto);
            }
   
            PlanProduccionCtrl1.BindTemporada = temporada.ToTemporadaComercial(); //new TemporadaComercial() { FechaDesde = temporada.FechaDesde, FechaHasta = temporada.FechaHasta };
            PlanProduccionCtrl1.ProductosDataSource = productos;
            PlanProduccionCtrl1.DataBind();
        }

        protected void lnkGuardarCabecera_Click(object sender, EventArgs e)
        {
            try
            {
                PresupuestoProduccion newPresu = new PlanProd.Contracts.PresupuestoProduccion();
                newPresu.Id = PresupuestoProduccion.Id;
                newPresu.Nombre = this.txtNombre.Text;
                               
                WebServiceHelper.SavePresupuestoProduccion(newPresu);
                PresupuestoProduccion = WebServiceHelper.GetPresupuestoProduccionById(PresupuestoProduccion.Id);
                Bind();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkAprobar_Click(object sender, EventArgs e)
        {
            try
            {
                int presupuestoProduccionId = Convert.ToInt32(this.txtPresupuestoId.Text);
                WebServiceHelper.AprobarPresupuestoProduccion(presupuestoProduccionId, BaseWebPage.CompanyId, BaseWebPage.UserName, true);
                PresupuestoProduccion = WebServiceHelper.GetPresupuestoProduccionById(presupuestoProduccionId);
                Bind();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect("/App/PresupuestoProduccionList.aspx", true);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}